/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ch.hslu.prg2.team2.logic;

/**
 * Computer plaposYer with simple logic
 *
 * @author Claudio
 */
public class AwareComputerPlayer extends RandomComputerPlayer 
{
    private int posX;
    private int posY;
    //Ist ein wert das verhindert das der Computer bei besetzen des 4discplatzes 
    //den wert posX-4 verwendet wie bei horizontalem reihen
    private int r = 0;
//    private int t = 4;

    public AwareComputerPlayer(String name) {
        super(name);
    }

    /**
     * returns the column index posX for the chosen column
     */
    public int playNextDisc(INextMove nextMove) {
        //Wenn der Computer gewinnen kann macht er es als erstes
        if (posX < nextMove.getColumnCount() && posX >= 0 && posY < nextMove.getRowCount() && posY >= 0) {
            if (this.win(nextMove) == true) {
            //Wenn die spielfläche frei ist.

                if (posX - 4 >= 0 && nextMove.getDisc(posY, posX - 4) == null) {
                    //Fals übereinander gestapelt wird soll diese methode nichts bringen
                    if (r == 0) {
                        return (posX - 4);
                    }
                    r = 0;
                }
                if ((nextMove.getDisc(posY, posX) == null)) {
                    return posX;
                }        
            } //Wenn der Computer Blockieren kann macht er es als erstes
            if (this.block(nextMove) == true){
                if (posX - 3 >= 0 && nextMove.getDisc(posY, posX - 3) == null) {
                    //Fals übereinander gestapelt wird soll diese methode nichts bringen
                    if (r == 0) {
                        return (posX - 3);
                    }
                    r = 0;
                }
                if ((nextMove.getDisc(posY, posX) == null)) {
                    return posX;
                }        
            }
        }
        return setRandom(nextMove);
    }

    /**
     * Setzt den Letzten Disc zum gewinnen. Ruft dementsprechend die Methoden
     * check... auf.
     *
     * @return Gibt eine Zahl zwischen 0 bis 7 zurÃ¼ck auf der posX Achse.
     */
    public boolean win(INextMove nextMove) {

        if (check3InRow1(nextMove) == true) {
            return true;
        }
        if (check3InRow2(nextMove) == true) {
            return true;
        } 
        //        else if(check3Diagonal1() == true){
        //            
        //        }
        //        else if(check3Diagonal2() == true){
        //            
        //        }
        else {
            return false;
        }
    }

    /**
     * Hindert den Gegner zu gewinnen. Ruft dementsprechend die Methoden
     * check... auf.
     *
     * @return Gibt eine Zahl zwischen 0 bis 7 zurÃ¼ck auf der posX Achse.
     */
    public boolean block(INextMove nextMove) {
        if (check3InRow1H(nextMove) == true) {
            return true;
        }
        if (check3InRow2H(nextMove) == true) {
            return true;
        }
        //        else if(check3Diagonal1() == true){
        //            
        //        }
        //        else if(check3Diagonal2() == true){
        //            
        //        } 
        return false;
    }

    /**
     * Prueft ob 3 Discs nebeneinander sind
     *
     * @return boolean
     */
    public boolean check3InRow1(INextMove nextMove) {
        int row = nextMove.getRowCount();
        int col = nextMove.getColumnCount();
        int count = 0;
        this.posX = 0;
        this.posY = 0;

        for (int y = 0; y < row; y++) {
            for (int x = 0; x < col; x++) {
                if ((nextMove.getDisc(y, x) != null) && (nextMove.getDisc(y, x).getPlayer().isHuman() == false)) {
                    count++;
                    //hier irgenwo ist ein fehler
                    if (count == 3) {
                        this.posX = x + 1;
                        this.posY = y;
                        count = 0;
                        return true;
                    }
                } else {
                    count = 0;
                }
            }

        }
        return false;
    }

     /**
     * Prueft ob der SPieler 3 Discs nebeneinander hat um spàter zu blockieren
     *
     * @return boolean
     */
    public boolean check3InRow1H(INextMove nextMove) {
        int row = nextMove.getRowCount();
        int col = nextMove.getColumnCount();
        int count = 0;
        this.posX = 0;
        this.posY = 0;

        for (int y = 0; y < row; y++) {
            for (int x = 0; x < col; x++) {
                if ((nextMove.getDisc(y, x) != null) && (nextMove.getDisc(y, x).getPlayer().isHuman() == true)) {
                    count++;
                    //hier irgenwo ist ein fehler
                    if (count == 2) {
                        this.posX = x + 1;
                        this.posY = y;
                        count = 0;
                        return true;
                    }
                } else {
                    count = 0;
                }
            }

        }
        return false;
    }

    /**
     * Prueft ob 3 Discs Uebereinander sind
     *
     * @return boolean
     */
    public boolean check3InRow2(INextMove nextMove) {
        int row = nextMove.getRowCount();
        int col = nextMove.getColumnCount();
        int count = 0;
        this.posX = 0;
        this.posY = 0;

        for (int x = 0; x < col; x++) {
            for (int y = 0; y < row; y++) {
                if ((nextMove.getDisc(y, x) != null) && (nextMove.getDisc(y, x).getPlayer().isHuman() == false)) {
                    count++;
                    if (count == 3 && y > 2) {
                        count = 0;
                        this.posX = x;
                        this.posY = y - 3;
                        r = 5;
                        return true;
                    }
                }
            }
            count = 0;
        }
        return false;
    }

     /**
     * Prueft ob der SPieler 3 Discs übereinander hat um spàter zu blockieren
     *
     * @return boolean
     */
    public boolean check3InRow2H(INextMove nextMove) {
        int row = nextMove.getRowCount();
        int col = nextMove.getColumnCount();
        int count = 0;
        this.posX = 0;
        this.posY = 0;

        for (int x = 0; x < col; x++) {
            for (int y = 0; y < row; y++) {
                if ((nextMove.getDisc(y, x) != null) && (nextMove.getDisc(y, x).getPlayer().isHuman() == true)) {
                    count++;
                    if (count == 3 && y > 2) {
                        count = 0;
                        this.posX = x;
                        this.posY = y - 4;
                        r = 5;
                        return true;
                    }
                }
            }
            count = 0;
        }
        return false;
    }

    /**
     * Prueft ob 3 Discs diagonal sind (rechts nach links)
     *
     * @return boolean
     */
    public boolean check3Diagonal2() {
        return false;
    }

    private void playDisc(int x) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public String toString() {
        return "Intelligenter Gegner";
    }
}
